package com.keqiang.filepicker.utils

import kotlinx.coroutines.*

/**
 * 线程工具
 *
 * @author Created by wanggaowan on 2022/5/21 23:04
 */
object ThreadUtils {
    private var scope = CoroutineScope(Dispatchers.IO)

    /**
     * 执行异步任务，可通过返回的[Job]取消任务
     * @param backgroundTask 后台执行的任务
     * @param callback 后台任务执行完成后UI线程回调
     */
    fun <T> execute(backgroundTask: suspend CoroutineScope.() -> T?, callback: ((T?) -> Unit)? = null): Job {
        if (!scope.isActive) {
            scope = CoroutineScope(Dispatchers.IO)
        }

        return scope.launch {
            val t = backgroundTask.invoke(this)
            callback?.let {
                launch(Dispatchers.Main) {
                    it.invoke(t)
                }
            }
        }
    }

    /**
     * 关闭由所有通过调用[execute]执行的任务
     */
    fun cancel() {
        scope.cancel()
    }
}
